#include <stdio.h>

void PrintArray(int (*a)[3])
{
    printf("fun:%ld\n",sizeof(a));
    for(int i = 0; i < 2; i++)
    {
        for(int j = 0; j < 3; j++)
        {
            printf("%d ",a[i][j]);
            //printf("%x ",&a[i][j]);
        }
        printf("\n");
    }
}

int main()
{
    //定义一个两行三列的二维数组    前行后列
    //初始化
    //int a[2][3] = {{1,2,3},{4,5,6}};
    //int b[2][3] = {1,2,3,4,5,6};
    //二维数组在内存中的排布:连续地址 
    //PrintArray(a);


    //a的理解
    //printf("main:%ld\n",sizeof(a));
    // a:一维数组指针            +1跨一个一维数组
    // &a：二维数组指针          +1跨一个二维数组
    // &a[0]：一维数组指针       +1跨一个一维数组
    // &a[0][0]：数组元素指针    +1跨一个元素
    // printf("%x %x %x %x %x\n",a,&a,&a[0],&a[0][0],a[0]);
    // printf("%x %x %x %x\n",a+1,&a+1,&a[0]+1,&a[0][0]+1);

    // printf("%d\n",**(a+1));
    // printf("%d\n",*(a[0]+1));       //a[0]为首元素地址


    // //指针数组
    // int *p[2];
    // //p[0]指向a的第一行的一维数组
    // p[0] = a;
    // //p[1]指向a的第二行的一维数组
    // p[1] = a + 1;
    // //a相当于p取值取两个*  a[0]相当于p[0]取值取一个*
    // printf("%d\n",*(p[0]+1));
    // printf("p1的值,即a1的地址%d\n",*(p+1));
    // printf("a1的值%d\n",**(p+1));

    //a = &a[0]

    // int (*p)[2] = a;    //[]里的数表示p+1跨几个数
    // printf("%x\n",**(p+1));

    int* a[2];
    int b1 = 10;
    int b2 = 20;
    a[0] = &b1;
    a[1] = &b2;
    int* (*p)[2] = a; //指向一个指针数组的数组指针(三级指针)
    printf("%d\n",***p);

    return 0;
}